#ifndef NETLIB_EVENTLOOPTHREADPOOL_H
#define NETLIB_EVENTLOOPTHREADPOOL_H

// IO线程池类

#include "noncopyable.h"
#include "Types.h"

#include <functional>
#include <memory>
#include <vector>

namespace netlib
{

namespace net
{

class EventLoop;
class EventLoopThread;

class EventLoopThreadPool : noncopyable
{
public:
    typedef std::function<void(EventLoop*)> ThreadInitCallback;

    EventLoopThreadPool(EventLoop* baseLoop, const string& nameArg);

    ~EventLoopThreadPool();

    // 设置线程数量
    void setThreadNum(int numThreads) { numThreads_ = numThreads; }
    
    // 开启线程池，传入回调函数
    void start(const ThreadInitCallback& cb = ThreadInitCallback());

    EventLoop* getNextLoop(); // 轮叫方式，为新连接分派一个IO线程

    EventLoop* getLoopForHash(size_t hashCode); // 哈希算法方式，为新连接分派一个IO线程

    // 返回EventLoop列表loops_，如果loops_为空则返回主IO线程
    std::vector<EventLoop*> getAllLoops();

    bool started() const { return started_; } // 查询线程池是否开启

    const string& name() const { return name_; } // 返回线程池名称

private:

    EventLoop* baseLoop_;       // accept对象所属的EventLoop对象，主IO线程
    string name_;               // 线程池名
    bool started_;              // 是否开启
    int numThreads_;            // 线程数
    int next_;                  // 新连接到来，所选择的EventLoop对象下标
    std::vector<std::unique_ptr<EventLoopThread>> threads_;     // IO线程池列表
    std::vector<EventLoop*> loops_;                             // EventLoop列表

}; // class EventLoopThreadPool end

}  // namespace net end

}  // namespace netlib end

#endif